Atomare Elemente

Das Designsystem von Portfolioland ist teilweise nach dem Prinzip des Atomaren Designs strukturiert. Es umfasst Aspekte wie Farben, Typografie, Buttons, Formulare und Funktionen, die in diesem Dokument detailliert beschrieben sind.

Konzept der Nutzerführung

Das Erstellen von Portfolios im künstlerischen Kontext benötigt möglichst große Freiheiten in der Gestaltung der Inhalte.

In Portfolioland werden der Nutzer:in diese Freiheiten in der Gestaltung durch ein Drag and Drop System gegeben.

Im Profil kann die Nutzer:in

Typographie
Typographie
Farben
Farben

Farben.png

Bedeutung des Farbcodes

Im Designsystem spielen Farben eine entscheidende Rolle, da sie verschiedene Aufgaben erfüllen. Die Hauptfarbe, die durch den Hex-Code #A32EFF repräsentiert wird, dient als öffentliche Farbe und wird vor allem für die Repräsentation des "öffentlichen Status" in Elemente verwendet. Die sekundäre Farbe, definiert als #FFA92C, fungiert als private Farbe und findet bei Elementen Einsatz, die den Status "Privat" repräsentieren .
Die elementare Funktion der Farbgebung besteht darin, die Zustände der Seite zu unterscheiden. Hier kommt die tertiäre Farbe ins Spiel, die durch den Code #BFFDF dargestellt wird und als Akzentfarbe fungiert. Sie zeigt dem Benutzer an, welche Elemente momentan im Focus sind.
Die neutrale Farbe, codiert als #0C0C20, wird hingegen hauptsächlich für den Text verwendet, um eine gute Lesbarkeit zu gewährleisten.
Für Fehlermeldungen steht die Farbe mit dem Code #E31C3D bereit, um diese deutlich hervorzuheben. Insgesamt tragen diese Farbcodes maßgeblich zur visuellen Kohärenz und Benutzerfreundlichkeit des Designs bei.

States
States

Frame 7891.png

Codeeinbettung

Der folgende Codeblock präsentiert die Vorlagen in der app.css-Datei für die verschiedenen Farben. Diese können dann im Code mithilfe von var(--example) verwendet werden. Beachten Sie jedoch, dass die app.css-Datei über einen Style-Link eingebunden sein muss.

// app.css
:root{
--accent-color-dark: rgba(75, 223, 255, 0.4);

//Background-Colors:

--bg-bright: rgb(241, 240, 240);
--bg-dark: rgb(0 0 0);
--bg-light: rgb(241, 240, 240);


--grey: #ccc;
//Text-Colors
--text-light: #0c0c20;
--text-light-100: #0c0c20b1;

--white: #FFF;
--primary: #A32EFF;
--secondary: #FFA92C;
--tertiary: #4bffdf;
}
Buttons
Buttons

Button

Button LIGHT MODE.png
Buttons sind unverzichtbare Bestandteile des User Interfaces, da sie dem Benutzer klare Interaktionsmöglichkeiten bieten. Anders als Inputfelder, die Daten sammeln, initiieren Buttons unmittelbare Aktionen. Durch ihre visuelle Gestaltung und Beschriftung kommunizieren sie dem Nutzer, welche Funktion sie auslösen. Dadurch ermöglichen sie eine intuitive Navigation und Interaktion innerhalb einer Anwendung oder Webseite. Ob zum Bestätigen einer Auswahl, zum Absenden eines Formulars oder zum Starten einer bestimmten Funktion – Buttons sind das Bindeglied zwischen dem Benutzer und der gewünschten Aktion, und somit ein essenzieller Bestandteil jeder Benutzeroberfläche.

<button>Button Lable</button>

<style>

button {
	display: flex;
	justify-content: center;
	align-self: center;
	flex-direction: row;
	align-items: center;
	gap: 0.25rem;
	color: var(--text-light);
	cursor: pointer;
	padding: 0.3rem;
	border: 0.1rem solid var(--text-light)
	border-radius: 20rem;
	
	transition-property: all;
	transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
	transition-duration: 1000ms;
	&:hover {
		outline: 0.2rem solid var(--tertiary);
		transition-property: all;
		transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
		transition-duration: 1000ms;
		}

	&:focus {
		outline: 0.1rem solid var(--tertiary);
	}
}

</style>

Forms
Forms

"Toggle Switch" ist noch nicht erstellt. Klicken zum Erstellen.

Molekulare Elemente

Modals
Modals
Svelte-Grid
Svelte-Grid

Svelte-Grid ist eine Library für Sveltekit die es ermöglicht Kästen per Drag und Drop in einem Koordinatensystem auf de Website zu verschieben und zu skalieren.


"0002_Tools/Tools/DEVDEPENDENCIES/TipTap" ist noch nicht erstellt. Klicken zum Erstellen.

Funktionale Elemente

Login
Login

LOGIN 1 DESKTOP.png
LOGIN STUDENT.png

Login

Das Login für Portfolioland ist über Email und Passwort möglich. Der visuellen Ästhetik folgend haben die Eingabeformularelemente abgerundete Kanten und nutzen die vorgegebenen Komponenten aus Buttons und Forms. Sollte etwas bei der Eingabe/Absenden nicht korrekt sein, wird dem Benutzer dies durch ein Element aufgezeigt, das ein- und ausfadet.

Dieses Element ist in den Farben für den Fehlerzustand gehalten und beinhaltet zusätzlich Informationen über den potenziellen Fehler.

LOGIN 1 DESKTOP Error.png

Feature

  • Funktion Login
  • Funktion Rückmeldung
  • SAML-Integration

TODO: SAML- Integration.
Das Tool soll nach Möglichkeit einen möglichst barrierearmen Einwahlprozess bieten. Hierzu soll eine Integration der SAML/Shibboleth Authentifizierung der Universität Kassel angestrebt werden.

Code

Clientseitiger Code (Frontend)

Hier ist ein Beispielcode, der die Implementierung des Designs im Framework 0002_Tools/Tools/JS/Sveltekit zeigt, wobei besonders die Verwendung der {#if}-Schleifen zur Darstellung der rückläufigen Formwerte zu beachten ist:

<script>

import LoginButton from '$lib/components/Buttons/loginButton.svelte';

import { PUBLIC_TEST_ACCOUNT, PUBLIC_TEST_ACCOUNT_PW } from '$env/static/public';

  

export let form;

let email = PUBLIC_TEST_ACCOUNT;

//TODO: Before release delete value

let password = PUBLIC_TEST_ACCOUNT_PW;

//TODO: Before release delete value

let visible = false;

</script>

  

<div class="loginwrapper">

<form method="POST" action="/login">

<input id="email" name="email" type="text" placeholder="Enter your e-mail" value={form?.email ?? email}/>

<input id="password" name="password" type="password" placeholder="Enter your password" bind:value={password} />

<LoginButton />
  
{#if form?.missing}<p class="error">Please enter USERNAME</p>{/if}
{#if form?.incorrect}<p class="error">Please enter PASSWORD</p>{/if}
{#if form?.invalid}<p class="error">Invalid PASSWORD</p>{/if}

</form>

</div>

  

<style>

.loginwrapper {

width: 100dvw;

width: 100vw;

height: 100%;

display: flex;

justify-content: center;

margin-top: 30vh;

}

  

form {

display: flex;

align-items: center;

justify-content: center;

flex-direction: column;

margin-top: 10px;

}

p {

display: flex;

align-items: center;

justify-content: center;

flex-direction: column;

margin-top: 10px;

margin: 0.5%;

padding: 10px 15px;

width: max-content;

  

border: 1px solid #000000;

border-radius: 200px;

color: #000000;

margin-top: 10px;

}

.error {

margin-top: 5rem;

background-color: rgba(219, 69, 69, 0.821);

color: #ffffff;

transition: 2s all;

opacity: 0.5;

transition: opacity 10s;

box-shadow: 2px 2px 4px #00000041;

}

.error {

-webkit-animation: 4s 0s normal forwards 1 fadeout;

animation: 4s 0s normal forwards 1 fadeout;

}

@keyframes fadeout {

0% {

opacity: 1;

}

66% {

opacity: 0;

}

100% {

opacity: 0;

}

}

  

@-webkit-keyframes fadeout {

0% {

opacity: 1;

}

66% {

opacity: 0;

}

100% {

opacity: 0;

}

}

  

input {

margin: 0.7rem;

padding: 10px 15px;

background: #ffffff;

border: 0.1rem solid #000000;

border-radius: 200px;

color: #000000;

}

input:focus {

opacity: 1;

transition: 0.4s;

box-shadow: 2px 2px 4px #00000041;

}

  

button {

margin: 0.5%;

padding: 10px 15px;

background: #ffffff;

border: 0.1rem solid #000000;

border-radius: 200px;

color: #000000;

margin-top: 10px;

}

button:hover {

background: #94db93;

opacity: 1;

transition: 0.4s;

box-shadow: 2px 2px 4px #00000041;

}

button:focus {

background: #94db93;

opacity: 1;

transition: 0.4s;

box-shadow: 2px 2px 4px #00000041;

}

</style>

In diesem Beispiel wird das Formular mit den Eingabefeldern für E-Mail und Passwort dargestellt. Beim Absenden des Formulars wird überprüft, ob beide Felder ausgefüllt sind. Wenn nicht, wird eine Fehlermeldung angezeigt. Beachten Sie die Verwendung der {#if}-Schleife, um die Fehlermeldung nur dann anzuzeigen, wenn ein Fehler auftritt

Serverseitiger Code

import { error, fail, redirect } from '@sveltejs/kit';

export const actions = {

/**

* The default action for the login page.

*

* @async

* @param {Object} context - The context object.

* @param {Request} context.request - The request object.

* @param {Object} context.locals - The locals object.

* @throws {Error} If an error occurs during the action.

* @returns {Promise} A promise that resolves to a redirect or failure response.

*/

default: async ({ request, locals }) => {

const body = Object.fromEntries(await request.formData());

let email = body.email;

  

try {

await locals.pb.collection('users').authWithPassword(body.email, body.password);

  

} catch (err) {

if (!body.email) {

return fail(400, { email, missing: true });

}

  

if (!body.password) {

return fail(400, { email, incorrect: true });

}

  

if (!locals.pb?.authStore?.model?.verified) {

return fail(400, { email, invalid: true });

}

  

console.log('Error: ', err);

throw error(500, 'Something went wrong logging in');

}

  

throw redirect(303, `/profil/${locals.pb.authStore.model.name}`);

},

};